package com.tokyoceoh;

import java.io.IOException;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.Tweet;
import twitter4j.Twitter;
import twitter4j.TwitterException;

@SuppressWarnings("serial")
public class GaetwbotServlet extends HttpServlet {

	/**
	 * 永続化する必要がある？
	 */
	private boolean needToPersisitant;
	
	/**
	 * XinlingBot用のコンテナ
	 */
	private XinlingBotContainer xinlingBotContainer;
	
	/**
	 * 初期化する
	 */
	private void inintialize(){
		xinlingBotContainer = new XinlingBotContainer();
		
		xinlingBotContainer.setTwitter(new Twitter(xinlingBotContainer.getUserName(),xinlingBotContainer.getPassword()));
		xinlingBotContainer.setPmfInstance(PMF.get());
		xinlingBotContainer.setPm(xinlingBotContainer.getPmfInstance().getPersistenceManager());		
	}
	
	/**
	 * ポストをゲットする
	 * @param req GAEから送られる、HttpServletRequest
	 * @param resp GAEから送られる、HttpServletResponse
	 */
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws IOException {
		resp.setContentType("text/plain");
		resp.setCharacterEncoding("UTF-8");
		
		try {
			inintialize();
			
			// 検索用のキーワードを取得する
			List<SearchWord> swList = getSearchWordList();
			
			// 前回の取得日時を得る
			LastTimeEntity lastTimeEntity = getLastTimeEntity();

			// 検索キーをまわしながらポストを作って行く。
			for(SearchWord word : swList){
				List<Tweet> tweetsList = searchTweet(word);
				
				for(Tweet tw : tweetsList){
					
					resp.getWriter().println(tw.toString()); // DEBUG用
					// 前回の取得日時以降のポストかどうか
					if(tw.getCreatedAt().compareTo(lastTimeEntity.getDate()) <= 0){
						continue;
					}
					
					// RTがついているTweetは拾わない。
					if(tw.getText().indexOf("RT") != -1){
						continue;
					}
					
					// メッセージを作ってポストする
					xinlingBotContainer.getTwitter().updateStatus(createPostMessage(tw));
				}
			}
			
			lastTimeEntity.setDate(new Date());
			
			resp.getWriter().println(lastTimeEntity.getDate().toString()); // DEBUG用

			// 時刻を永続化
			try{
				if(needToPersisitant){
					xinlingBotContainer.getPm().makePersistent(lastTimeEntity);
				}
			}
			finally{
				xinlingBotContainer.getPm().close();
			}
			
		} catch (TwitterException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 検索用のキーワードのリストを取得する
	 * @return 取得した検索用キーワードのリスト
	 */
	private List<SearchWord> getSearchWordList(){
		
		String googleQuery = "select from " + SearchWord.class.getName();	
		List<SearchWord> list = (List<SearchWord>)xinlingBotContainer.getPm().newQuery(googleQuery).execute();
		
		
		return list;
	}
	
	/**
	 * ポストするためのメッセージを作成する。
	 * @param tw メッセージ生成用のTweet
	 * @return 作成されたメッセージ
	 */
	private String createPostMessage(Tweet tw){
		String preString = "RT @" + tw.getFromUser() + " : ";
		if(tw.getText().length() > 140 - preString.length()){
			return preString + tw.getText().substring(0,140 - preString.length());
		}
	
		return preString + tw.getText();
	}
	
	/**
	 * Tweetを検索する
	 * @param word 検索するキーワード
 	 * @return 検索結果のTweetのリスト
	 * @throws TwitterException
	 */
	private List<Tweet> searchTweet(SearchWord word) throws TwitterException{
		Query query = new Query(word.getKey());
		QueryResult result = xinlingBotContainer.getTwitter().search(query);
		
		List<Tweet> tweetsList = result.getTweets();
		
		return tweetsList;
	}
	
	/**
	 * 前回の取得日時を取得する
	 * @return 取得した前回の取得日時
	 */
	private LastTimeEntity getLastTimeEntity(){
		
		String googleQuery = "select from " + LastTimeEntity.class.getName();
		
		List<LastTimeEntity> list = (List<LastTimeEntity>)xinlingBotContainer.getPm().newQuery(googleQuery).execute();
		
		
		if(list.size() != 0){
			needToPersisitant = false;
			return list.get(0);
		}
		else{
			needToPersisitant = true;
			return new LastTimeEntity("LastTimeEntity", new Date(0));
		}
	}
}